#导入鸢尾花数据集
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split                                 #训练集与测试集的划分


#提取特征，划分数据集
x,y=load_iris().data[:,2:4],load_iris().target								         #提取花瓣长度与花瓣宽度两个作为特征，训练模型
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=1,test_size=50)      #将数据集拆分为训练集与测试集，随机数种子，样本50

#使用逻辑回归算法，构建一个分类器，能够对三种类别的鸢尾花进行分类并使用matplat.lib  进行画图
#1数据准备2.训练与评估模型3.显示分类效果

#第二步训练与评估模型
#导入逻辑回归模型与评估分类准确率的方法
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score


#定义与训练逻辑回归模型
model=LogisticRegression()		#建立逻辑回归模型
model.fit(x_train,y_train)		#训练模型


#模型评估
ac=accuracy_score(y_test,model.predict(x_test))   #专门为分类的包    分类用accurcacy（） ,
print("模型预测准确率：",ac)


#第三步显示分类效果
#导入Matplotlib与NumPy库
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap  #颜色模块
import numpy as np


#绘制分类界面
N,M=500,500                                                         #网格采样点的个数，采样点越多，分类界面图越精细
t1=np.linspace(0,8,N)				                                #生成采样点的横坐标值   0-8，取500个点   横坐标
t2=np.linspace(0,3,M)				                                #生成采样点的纵坐标值    
x1,x2=np.meshgrid(t1,t2)				                            #生成网格采样点
x_new=np.stack((x1.flat,x2.flat),axis=1)	                        #将采样点作为测试点    
                                                                    #用来将两个一维数组合并成一个二维数组    axis按列合并，将两个一维数组看成两列
y_predict=model.predict(x_new)			                            #预测测试点的值
y_hat=y_predict.reshape(x1.shape)			                        #与x1设置相同的形状
iris_cmap=ListedColormap(["#ACC6C0","#FF8080","#A0A0FF"])	#设置分类界面的颜色
plt.pcolormesh(x1,x2,y_hat,cmap=iris_cmap)	                       #绘制分类界面 x1x2所有采样点的横纵坐标的集合，类别，该类别对应的颜色


#绘制3种类别鸢尾花的样本点（散点图）
plt.scatter(x[y==0,0],x[y==0,1],s=30,c='g',marker='^')	           #绘制标签为0的样本点
plt.scatter(x[y==1,0],x[y==1,1],s=30,c='r',marker='o')             #绘制标签为1的样本点
plt.scatter(x[y==2,0],x[y==2,1],s=30,c='b',marker='s')             #绘制标签为2的样本点


#设置坐标轴的名称并显示图形
plt.rcParams['font.sans-serif']='Simhei'
plt.xlabel('花瓣长度')
plt.ylabel('花瓣宽度')
plt.show()

